home *** CD-ROM | disk | FTP | other *** search
/ Languguage OS 2 / Languguage OS II Version 10-94 (Knowledge Media)(1994).ISO / language / embedded / mcu / float09.arc / FRNBAK.SA < prev    next >
Text File  |  1987-03-04  |  33KB  |  1,262 lines

  1.  TTL 'FRONT AND BACK END - COPYRIGHT (C) MOTOROLA 1980.'
  2.   NAM  FRNBAK
  3. *
  4. * COPYRIGHT (C) MOTOROLA 1980.
  5. *
  6. *
  7. ******************************************************************
  8. *
  9. *  F R N B A K
  10. *
  11. *  FRONT AND BACK END PROCESSOR. THIS BLOCK OF CODE CONTAINS ALL
  12. *  THE FRONT AND BACK END PROCESSING FOR ALL THE FUNCTIONS.
  13. *  IT INITIALIZES THE STACK FRAME, LOADS THE ARGUMENTS,
  14. *  CALLS THE OPERATIONS, CHECKS FOR TRAPS, RETURNS THE RESULT
  15. *  AND CLOSES THE STACK FRAME. FOR STACK CALLS, IT ALSO
  16. *  MANIPULATES THE STACK.
  17. *
  18. *  TWO TYPES OF CALLS TO THE FP PACKAGE EXIST: STACK
  19. *  CALLS AND REGISTER CALLS. EACH HAS A UNIQUE ENTRY
  20. *  POINT.
  21. *
  22. *
  23. *    LBSR  FPREG     REGISTER CALL
  24. *    FCB   OPCODE
  25. *
  26. *     OR
  27. *
  28. *    LBSR FPSTAK     STACK CALL
  29. *    FCB  OPCODE
  30. *
  31. *
  32. *  MAJOR REVISIONS:
  33. *
  34. *      REVISER          DATE          REASON
  35. *    JOEL BONEY      2-29-80      ORIGINAL
  36. *    JOEL BONEY      4-21-80      SINGLE ENTRY POINTS
  37. *    JOEL BONEY      7-02-80      REDUCE SIZE
  38. *    JOEL BONEY      7-25-80      INCLUDE TPARAM IN IREG/ISTACK
  39. *                      CALLS
  40. *    JOEL BONEY      7-29-80      INCLUDE HEADER AND COPYRIGHT
  41. *    JOEL BONEY      8-20-80      IMPROVE PERFORMANCE
  42. *    JOEL BONEY     12-08-80      UPDATE HEADER
  43. *
  44. *****************************************************************
  45. *
  46. *  LINKING LOADER DEFINITIONS
  47. *
  48.    XREF  IREG,GETARG,DISPAT,TRAP,MOVRSL,CLSTAK
  49.    XREF  ISTACK,SIZE,SIZTAB
  50.    XDEF  FPREG,FPSTAK
  51.    XDEF  ROMSTR
  52. *
  53. *******************************************************************
  54.   PAGE
  55. *
  56. ***************************************************************
  57. ***************************************************************
  58. *
  59. * HERE IS THE EQUATE FOR THE START OF THE ROM
  60. * NOTE: THIS EQUATE SHOULD ALWAYS BE THE FIRST
  61. * BYTE IN THIS MODULE!!!!!!!!!!!!!!!!!!!!!!!!
  62. *
  63. ROMSTR EQU  *
  64. *
  65. *****************************************************************
  66. *
  67. * H E A D E R
  68. *
  69. *    THIS HEADER IS COMPATABLE WITH OS9-1 AND IS THOUGHT
  70. *    TO CONTAIN SUFFICIENT INFORMATION TO BE USED IN
  71. *    OTHER ROM-LINK SCHEMES.
  72. *
  73. * START OF STANDARD HEADER
  74.   FDB $87CD        SYNC BYTES
  75.   FDB $2000        MODULE SIZE (8K)
  76.   FDB NAME-ROMSTR   OFFSET TO NAME
  77.   FCB $B1        MULTI-MODULE,6809 OBJECT CODE
  78.   FCB $81        SHAREABLE, REV. 1
  79. * ODD VERTICLE PARITY OF 8 BYTES ABOVE
  80.   FCB $A5!X((NAME-ROMSTR)!>8)!X((NAME-ROMSTR)!.$FF)
  81. * END OF STANDARD HEADER
  82. * START OF MULTIMODULE INTERNAL ROUTINE DEFN'S
  83.   FCB 2         2 ENTRIES
  84. ENTRY1 EQU *
  85.   FCC /RE/        NAME=REG
  86.   FCB $80+'G
  87.   FDB FPREG-ROMSTR  OFFSET TO ENTRY
  88.   FDB 0         AMOUNT OF PERM STORAGE
  89.   FDB 155         MAX STACK SIZE
  90. ENTRY2 EQU *
  91.   FCC /STA/        NAME = STAK
  92.   FCB $80+'K
  93.   FDB FPSTAK-ROMSTR OFFSET TO ENTRY
  94.   FDB 0         PERMANENT STORAGE
  95.   FDB 185        MAX STACK SIZE
  96. * START OF MULTIMODULE EXTERNAL REFS
  97.   FCB 0         NO EXTERNAL REFS
  98. *
  99. ********* END OF OS9-1 TYPE HEADER ***********************
  100. *
  101. * MAIN MODULE NAME
  102. NAME FCC /FPO/        'FPO9'
  103.      FCB $80+'9
  104. *
  105. * KEEP THE COURTS HAPPY; PUT A COPYRIGHT MESSAGE IN
  106. * HUMAN READABLE MACHINE FORM.
  107. *
  108.   FCC /COPYRIGHT (C) MOTOROLA 1980/
  109. *
  110. * MAIN JUMP TABLE
  111. *
  112. FPREG BRA REGST     GO TO REGISTER CALL
  113. FPSTAK BRA STKST    GO TO STACK CALL
  114. *
  115. ************************************************************
  116. *   END OF ALL HEADER INFO  ********************************
  117. ************************************************************
  118.  PAGE
  119. *
  120. ***************************************************************
  121. **************************************************************
  122. *
  123. *  ENTRY POINTS FOR FUNCTIONS
  124. *
  125. *  ALL CALLS TO THE FP PACKAGE COME THRU THIS FUNCTION
  126. *  SELECT ROUTINE. TWO TYPES OF CALLS EXIST: STACK
  127. *  CALLS AND REGISTER CALLS.
  128. *
  129. **********************************************************
  130. *********************************************************
  131. **********************************************************
  132. *********************************************************
  133. *
  134. *  REGISTER CALL ENTRY POINT
  135. *
  136. *  FORM OF CALL:
  137. *     LBSR FPREG
  138. *     FCB  OPCODE
  139. *
  140. **********************************************************
  141. *
  142. REGST EQU *             FPREG JUMPS TO HERE
  143.   PSHS #ALL             PUSH CALLER'S REGS
  144.   LEAX REGJT,PCR         GET PTR TO REGISTER JUMP TABLE
  145.   BRA  MUTENT             JOIN MUTUAL ENTRY
  146. *
  147. ***********************************************************
  148. *
  149. *  STACK CALL ENTRY POINT
  150. *
  151. *  FORM OF CALL:
  152. *    LBSR FPSTAK
  153. *    FCB  OPCODE
  154. *
  155. **********************************************************
  156. *
  157. STKST EQU *             FPSTAK JUMPS TO HERE
  158.   PSHS    #ALL             PUSH CALLER'S REGS
  159.   LEAX    STAKJT,PCR         GET PTR TO STACK ENTRY JUMP TABLE
  160. *
  161. *  MUTUAL ENTRY CODE. X CONTAINS THE ADDRESS OF THE
  162. *  JUMP TABLE TO USE AND U CONTAINS A PTR TO THE
  163. *  PROPER STACK FRAME INIT ROUTINE
  164. *
  165. *  ON THE JUMP TO THE FUNCTION,  Y CONTAINS A PTR TO
  166. *  THE ADDRESS JUST ABOVE THE ^FPCB ON THE STACK IFF
  167. *  THE CALL IS A STACK CALL. THRU OUT THE DOCMENTATION
  168. *  THIS POINTER IS REFERED TO AS '^TOS' OR 'PTOS'.
  169. *
  170. *
  171. MUTENT    EQU  *
  172.   LDY  SIZREG,S          GET PTR TO CALLER'S PC
  173.   LDB  ,Y             GET OPCODE
  174.   ANDB #$3F             ISOLATE OPCODE INDEX
  175.   IF B,GT,#FCMAX         IF OPCODE IS ILLEGAL
  176.     LDB  #FCMAX+2         SUPPLY DUMMY OPCODE
  177.   ENDIF
  178.   LDD  B,X             GET OFFSET FROM JUMP TABLE
  179.   LEAX D,X             ADDR OF ROUTINE IS NOW IN X
  180.   LDA  ,Y+             GET OPCODE AGAIN AND BUMP RETURN PC
  181.   STY  SIZREG,S          STORE RETURN PC
  182.   LEAY    SIZREG+4,S         GET ^TOS FOR STACK CALLS
  183.   JMP  ,X             GO TO ROUTINE
  184. *
  185. *
  186. * REGISTER CALL JUMP TABLE
  187. *   TABLE MUST CONTAIN RELATIVE ADDRESSES TO THE START
  188. *   OF THE TABLE.
  189. *
  190. REGJT  EQU  *
  191.   FDB  RDYAD-REGJT         ADD
  192.   FDB  RDYAD-REGJT         SUB
  193.   FDB  RDYAD-REGJT         MUL
  194.   FDB  RDYAD-REGJT         DIV
  195.   FDB  RDYAD-REGJT         REM
  196.   FDB  RFPCMP-REGJT         COMPARE
  197.   FDB  RFPCMP-REGJT         TRAPPING COMPARE
  198.   FDB  RFPPCM-REGJT         PREDICATE COMPARE
  199.   FDB  RFPPCM-REGJT         TRAPPING PREDICATE COMPARE
  200.   FDB  MONAD-REGJT         SQRT
  201.   FDB  MONAD-REGJT         INT
  202.   FDB  RFPFXS-REGJT         FIXS
  203.   FDB  RFPFXD-REGJT         FIXD
  204.   FDB  RFPMOV-REGJT         MOV
  205.   FDB  RFPBD-REGJT         BINDEC
  206.   FDB  MONAD-REGJT         AB
  207.   FDB  MONAD-REGJT         NEG
  208.   FDB  RFPDB-REGJT         DECBIN
  209.   FDB  RFPFLS-REGJT         FLTS
  210.   FDB  RFPFLD-REGJT         FLTD
  211.   FDB  BADCAL-REGJT         BAD CALL EXIT
  212. *
  213. *
  214. *  STACK CALL JUMP TABLE. ALL ENTRIES IN THIS TABLE MUST
  215. *  BE RELATIVE TO THE START OF THE TABLE
  216. *
  217. STAKJT    EQU  *
  218.   FDB  SDYAD-STAKJT         ADD
  219.   FDB  SDYAD-STAKJT         SUB
  220.   FDB  SDYAD-STAKJT         MUL
  221.   FDB  SDYAD-STAKJT         DIV
  222.   FDB  SDYAD-STAKJT         REM
  223.   FDB  SFPCMP-STAKJT         COMPARE
  224.   FDB  SFPCMP-STAKJT         TRAPPING COMPARE
  225.   FDB  SFPCMP-STAKJT         PREDICATE COMPARE
  226.   FDB  SFPCMP-STAKJT         TRAPPING PREDICATE COMPARE
  227.   FDB  SMON-STAKJT         SQRT
  228.   FDB  SMON-STAKJT         INTEGER PART
  229.   FDB  SFPFXS-STAKJT         FIXS
  230.   FDB  SFPFXD-STAKJT         FIXD
  231.   FDB  SFPMOV-STAKJT         MOVE
  232.   FDB  SFPBD-STAKJT         BINDEC
  233.   FDB  SMON-STAKJT         AB
  234.   FDB  SMON-STAKJT         NEG
  235.   FDB  SFPDB-STAKJT         DECBIN
  236.   FDB  SFPFLS-STAKJT         FLTS
  237.   FDB  SFPFLD-STAKJT         FLTD
  238.   FDB  BADCAL-STAKJT           BAD CALL EXIT
  239.   PAGE
  240. *
  241. ************************************************************
  242. *
  243. *
  244. *
  245. *    LOCAL MACROS AND REGISTER LIST DEFINITIONS
  246. *
  247. *
  248. *
  249. ***************************************************************
  250. *
  251. * REGISTER LIST DEFINITIONS
  252. *
  253. ALL  REG  U,Y,X,D,CC
  254. ALLPC  REG  U,Y,X,D,CC,PC
  255. *
  256. ***************
  257. *
  258. * UP
  259. *
  260. *  LOCAL MACRO TO MOVE THE RETURN PC UP THE STACK N BYTES,
  261. *  RESTORE THE CALLER'S REGISTERS,FIX THE STACK POINTER
  262. *  AND RETURN TO THE ORIGINAL CALLER. N MUST BE GE 2.
  263. *
  264. *
  265. * THIS USE TO BE AN IN LINE MACRO EXPANSION, BUT IT WAS
  266. * CONVERTED TO A BRANCH TO COMMON CODE FOR BYTE EFFICIENCY.
  267. *
  268. UP  MACR
  269.   IFLT    \0-2
  270.     FAIL  **UP N; N MUST BE GE 2 **
  271.   ENDC
  272.   LDB  #\0             B CONTAINS N
  273.   LBRA DO_UP
  274.   ENDM
  275. *
  276. *  COMMON EXIT PROCESSING WHEN A STACK SHOULD BE MOVED
  277. *  UP N BYTES. THIS COMMON CODE IS ENTERED BY THE 'UP'
  278. *  MACRO
  279. *
  280. *  B REGISTER CONTAINS 'N' ON ENTRY
  281. *  S POINTS TO BOTTOM OF USER REGISTERS
  282. *
  283. *
  284. DO_UP  EQU  *
  285.   LEAY SIZREG,S          GET PTR TO PC ON STACK
  286.   LEAU B,Y             GET PTR TO WHERE WE WANT TO MOVE PC TO
  287.   MOVD (,Y),(,U)         MOVE PC UP STACK
  288.   STU  ,Y             STORE NEW SP WHERE PC USE TO BE
  289.   PULS #ALL             RESTORE ALL REGS EXCEPT PC
  290.   LDS  ,S             GET NEW SP (WHICH POINTS TO RETURN ADDRESS)
  291.   RTS
  292. *
  293. **************
  294. *
  295. *
  296. * DOWN
  297. *
  298. *  LOCAL MACRO TO MOVE CALLER'S REGS DOWN THE STACK
  299. *  N BYTES
  300. *  CALCULATES THE PROPER ^TOS AND LEAVES IT IN THE Y REG.
  301. *
  302. DOWN  MACR
  303.   LDB  #\0
  304.   LBSR DWNSUB
  305.   ENDM
  306. *
  307. *
  308. *******************************
  309. *
  310. * SUBROUTINE TO MOVE THE REGISTERS DOWN THE STACK 'B' BYTES.
  311. *
  312. * ON ENTRY B CONTAINS THE NUMBER OF BYTES TO MOVE DOWN
  313. *
  314. * ON EXIT ALL REGISTERS ARE RESTORED (INCLUDING Y)
  315. *
  316. DWNSUB EQU *
  317.   NEGB             MOVE SP DOWN B LOCATIONS
  318.   LEAS B,S
  319.   PSHS A,X,Y         PUSH SOME REGS
  320.   LEAX 5,S         X NOW PTS TO DESTINATION
  321.   NEGB             MAKE B POSITIVE AGAIN
  322.   ADDB #5
  323.   LEAY B,S         Y NOW PTS TO SOURCE
  324.   LDB #SIZREG+4      MOVE ALL REGS AND BOTH PC'S
  325. DWNLOP EQU *
  326.   MOVA (,Y+),(,X+)   MOVE 1 BYTE
  327.   DECB
  328.   BNE DWNLOP
  329.   PULS A,X,Y,PC      PULL REGS AND RETURN
  330.   PAGE
  331. **************************************************************
  332. *
  333. *
  334. *   REGISTER CALLS
  335. *
  336. *
  337. *  FOR MOST REGISTER CALLS THE INCOMMING REGISTERS LOOK LIKE:
  338. *    U = ^ARG1
  339. *    Y = ^ARG2
  340. *    X = ^RESULT
  341. *    D = ^FPCB
  342. *
  343. *  FOR MONADIC CALLS ARG2 IS THE SINGLE ARGUMENT, HENCE U IS
  344. *  A DON'T CARE.
  345. *
  346. *  FOR MOVES THE REGISTERS ARE DEFINED AS:
  347. *    U = PARAMETER WORD
  348. *    Y = ^ARG2
  349. *    X = ^RESULT
  350. *    D = ^FPCB
  351. *
  352. *  FOR COMPARES THE REGISTERS ARE DEFINED AS:
  353. *    U = ^ARG1
  354. *    Y = ^ARG2
  355. *    X = PARAMETER WORD
  356. *    D = ^FPCB
  357. *
  358. *
  359. *  FOR FLOAT TO BCD AND BCD TO FLOAT SEE THE ROUTINE
  360. *  HEADER FOR ARGUMENT DETAILS.
  361. *
  362. *
  363. *  BY THE TIME THE PROGRAM ACTUALLY GETS TO HERE THE REGISTERS
  364. *  LISTED ABOVE ARE DESTROYED. HENCE, THE SUBROUTINES MUST
  365. *  GET THE REGISTER VALUES FROM THE STACK FRAME WHERE THEY
  366. *  ARE SAVED.
  367. *
  368. *  ON ENTRY THE U REGISTER CONTAINS THE ADDRESS OF 'ISTACK'.
  369. *  THIS WAS DONE TO REDUCE THE SIZE OF THE NUMEROUS LBSR ISTACK'S.
  370. *
  371. *  ALL REGISTER ARE RESTORED ON EXIT.
  372. *
  373. **************************************************************
  374.   PAGE
  375. *
  376. **************** MONADIC CALLS **********************************
  377. *
  378. *
  379. *
  380. *  INTEGER PART, SQUARE ROOT, ABSOLUTE VALUE, NEGATE AND
  381. *  SOME MOVES.
  382. *
  383. *
  384. MONAD  EQU  *
  385.   LBSR IREG            INIT STACK FOR REG CALL
  386.   BRA  RMON             GO JOIN MUTUAL PROCESSING
  387. *
  388. ******************* DYADIC CALLS ****************************
  389. *
  390. *  REGISTER CALL
  391. *
  392. *  ADD SUB MUL DIV REM
  393. *
  394. *
  395. *  THIS CODE IS USED BY THE FOLLOWING DYADIC REGISTER CALLS:
  396. *    ADD, SUB, MUL, DIV, REM
  397. *
  398. RDYAD  EQU  *
  399.   LBSR IREG            GO INIT STACK FRAME
  400.   LDY  PARG1,U             GETARG(PARG1,^ARG1)
  401.   LEAX ARG1,U
  402.   CLRB                 ARGUMENT 1 FLAG
  403.   LBSR GETARG
  404.   BCC  RDYXIT             TRAPPING NAN ABORT
  405. *
  406. *  ENTER HERE FOR MONADIC CALLS:
  407. *    SQRT, INT
  408. *
  409. RMON  EQU *
  410.   LDB #1             ARGUMENT 2 FLAG
  411.   LDY PARG2,U             GETARG(PARG2,^ARG2)
  412.   LEAX ARG2,U
  413.   LBSR GETARG
  414. *
  415. * ENTER HERE FROM MOVE
  416. *
  417. IMOV  EQU *
  418.   BCC  RDYXIT             TRAPPING NAN ABORT
  419. *
  420. * ENTER HERE FOR INTEGER TO FLOAT
  421. * ENTER HERE FOR DECIMAL BCD TO FLOAT
  422. *
  423. IFLOAT    EQU  *
  424.   LBSR    DISPAT             GO DO FUNCTION
  425. SKIPFN    EQU  *             ENTER HERE TO SKIP CALL TO FUNCTION
  426.   LBSR    TRAP             TRAPS?
  427.   IFCC    CS             IF WE SHOULD RETURN RESULT THEN
  428.     LDX  PRESUL,U         MOVERESULT(PRESUL)
  429.     LBSR  MOVRSL
  430.   ENDIF
  431. RDYXIT    EQU  *
  432.   LBSR    CLSTAK             CLOSE STACK
  433. * BAD CALL ABORT.
  434. *   HERE WHEN CALLING OPCODE WAS ILLEGAL. JUST EXIT
  435. BADCAL EQU *
  436.   PULS    #ALLPC
  437.   PAGE
  438. *
  439. ******************
  440. *
  441. * GET1 - GETARG1(PARG1,^ARG1)
  442. *
  443. * LOCAL SUBROUTINE FOR REGISTER CALLS.
  444. * ON EXIT C IS SET IF TRAPPING NAN
  445. *
  446. ******************
  447. *
  448. GET1  EQU  *
  449.   LDY  PARG1,U             GETARG(PARG1,^ARG1)
  450.   LEAX ARG1,U
  451.   CLRB                 ARGUMENT 1 FLAG
  452.   BRA  GT2OUT             GO EXIT
  453. *
  454. ******************
  455. *
  456. * GET2 - GETARG2(PARG2,^ARG2) FOR MOST FUNCTIONS
  457. * GET2M - GETARG2(SOURCE,^ARG2) FOR MOVES ONLY
  458. *
  459. * LOCAL SUBROUTINE FOR REGISTER CALLS.
  460. * ON EXIT C IS SET IF TRAPPING NAN
  461. *
  462. ******************
  463. *
  464. GET2  EQU  *
  465.   LDB  #1             ARGUMENT 2 FLAG (USUALLY)
  466. * ENTER HERE TO GET ARG2 (SOURCE) FOR MOVES
  467. GET2M EQU *
  468.   LDY  PARG2,U             GETARG(PARG2,^ARG2)
  469.   LEAX ARG2,U
  470. GT2OUT    EQU  *
  471.   LBSR GETARG
  472.   RTS
  473.   PAGE
  474. ***************** NON PREDICATE COMPARES ************************
  475. *
  476. *
  477. *  REGISTER CALL
  478. *
  479. *  FOR COMPARES THE REGISTERS ARE DEFINED AS:
  480. *    U = ^ARG1
  481. *    Y = ^ARG2
  482. *    X = PARAMETER WORD
  483. *    D = ^FPCB
  484. *
  485. *
  486. RFPCMP    EQU  *
  487.   CLRB                 B = 0 = NO PREDICATE
  488.   BRA  PCMPMT             GO JOIN MUTUAL REGISTER COMPARE
  489. *
  490. ****************** PREDICATE COMPARES ****************************
  491. *
  492. *
  493. *  REGISTER CALL
  494. *
  495. RFPPCM    EQU  *
  496.   LDB    #1             B = 1 = PREDICATE FLAG
  497. *
  498. *  MUTUAL PROCESSING FOR ALL REGISTER CALL COMPARES
  499. *     B = 1 = IFF PREDICATE COMPARE; ELSE B = 0
  500. *
  501. PCMPMT    EQU  *
  502.   LDX  XREG-CCREG,S         GET PARAMETER WORD
  503.   LBSR IREG            GO INIT STACK FRAME
  504.   PSHS    B             SAVE PREDICATE COMPARE FLAG
  505.   BSR  GET1             GETARG(PARG1,^ARG1)
  506.   BCC  PCMXIT             TRAPPING NAN ABORT
  507.   BSR  GET2             GETARG(PARG2,^ARG2)
  508.   BCC  PCMXIT             TRAPPING NAN ABORT
  509.   LBSR    DISPAT             GO DO FUNCTION
  510.   LBSR    TRAP             TRAPS?
  511.   IFCC    CS             IF WE SHOULD RETURN RESULT THEN
  512.     IFTST  (,S),NE,#0          IF PREDICATE COMPARE
  513.       IFTST  (FRACTR,U),EQ,#0    IF PREDICATE IS TRUE THEN
  514.     BSETA  Z,(CCREG,U)    SET Z BIT
  515.       ELSE
  516.     BCLRA  NZ,(CCREG,U)   CLEAR Z BIT
  517.       ENDIF
  518.     ENDIF
  519.   ENDIF
  520. PCMXIT    EQU  *
  521.   BRA  RDYXIT            CLOSE STACK AND EXIT
  522. *
  523. *
  524.   PAGE
  525. *
  526. ************* FLOAT TO 32 BIT INTEGER *********************
  527. *
  528. * RFPFXD
  529. *
  530. * REGISTER CALL
  531. *
  532. *
  533. RFPFXD    EQU  *
  534.   LDB  #1             B = 1 = 32 BIT RESULT
  535.   BRA    FXSCOM
  536. *
  537. *
  538. ************** FLOAT TO 16 BIT INTEGER ******************************
  539. *
  540. * RFPFXS
  541. *
  542. * REGISTER CALL
  543. *
  544. RFPFXS    EQU  *
  545.   CLRB                 B = 0 = 16 BIT RESULT
  546. *
  547. *  COMMON CODE FOR REGISTER 'FIXES'
  548. *   A = FUNCTION CODE
  549. *   B = 0 = 16 BIT RESULT
  550. *   B NE 0 = 32 BIT RESULT
  551. *
  552. FXSCOM    EQU  *
  553.   LBSR IREG            GO INIT STACK FRAME
  554.   PSHS    B             SAVE RESULT SIZE FLAG
  555.   BSR  GET2             GETARG(PARG2,^ARG2)
  556.   BCC    FXSXIT             TRAPPING NAN AORT
  557.   LBSR    DISPAT             GO DO 'FIX'
  558.   LBSR    TRAP             TRAPS
  559.   IFCC    CS             IF WE SHOULD RETURN RESULT THEN
  560.     LDX  PRESUL,U
  561.     MOVD  (FRACTR,U),(,X)   MOVE 16 BITS OF RESULT
  562.     IFTST  (,S),NE,#0         IF 32 BIT RESULT
  563.       MOVD (FRACTR+2,U),(2,X)  MOVE LS BYTES OF RESULT
  564.     ENDIF
  565.   ENDIF
  566. FXSXIT    EQU  *
  567.   BRA  RDYXIT            CLOSE STACK AND EXIT
  568.   PAGE
  569. *
  570. *************** 32 BIT INTEGER TO FLOAT **************************
  571. *
  572. * RFPFLD
  573. *
  574. * REGISTER CALL
  575. *
  576. RFPFLD    EQU  *
  577.   LBSR IREG            INIT STACK FOR REGISTER CALLS
  578.   LDY    YREG,U             GET PTR TO INTEGER
  579.   MOVD    (,Y),(FRACT2,U)      MOVE INTEGER TO ARG2
  580.   MOVD    (2,Y),(FRACT2+2,U)
  581.   IFCC    EQ             IF LS BYTES EQUAL
  582.     LDD  ,Y             SEE IF MS BYTES ARE TOO (SET Z BIT ACCORDINGLY)
  583.   ENDIF
  584.   BRA  FLSCOM             GO JOIN MUTUAL PROCESSING
  585. *
  586. **************** 16 BIT INTEGER TO FLOAT ************************
  587. *
  588. * RFPFLS
  589. *
  590. * REGISTER CALL
  591. *
  592. RFPFLS    EQU  *
  593.   LBSR IREG            INIT STACK FRAME FOR REGISTER CALL
  594.   LDY    YREG,U             GET PTR TO INTEGER
  595.   MOVD    (,Y),(FRACT2,U)      MOVE 16 BIT INTEGER TO ARG2
  596. *
  597. * COMMON ENTRY FOR 16,32 BIT INTEGER TO FLOAT STACK CALLS
  598. *   ON ENTRY Z = 1 IFF INTEGER IS ZERO
  599. *
  600. FLSCOM    EQU  *
  601.   IFCC    EQ             IF NOT ZERO THEN
  602.     MOVA #TYZERO,(TYPE2,U)   TYPE := ZERO
  603.   ENDIF
  604.   LBRA    IFLOAT             GO JOIN MUTUAL PROCESSING
  605.   PAGE
  606. *
  607. *
  608. ************** MOVE ARG2 TO RESULT **********************************
  609. *
  610. * RFPMOV
  611. *
  612. *  U = PARAMETER WORD
  613. *  Y = ^ARG2
  614. *  X = ^RESULT
  615. *  D = ^FPCB
  616. *
  617. *  REGISTER CALL
  618. *
  619. *  IF THE PRECISION OF THE SOURCE = THE PRECISION OF
  620. *  THE DESTINATION, THEN DON'T BUILD THE STACK FRAME
  621. *  OR CALL THE DISPATCH ROUTINE. HANDLE THE WHOLE
  622. *  CALL HERE.
  623. *
  624. *
  625. RFPMOV    EQU  *
  626.   LDD  UREG-CCREG,S        RESTORE PARAMETER WORD
  627.   LBSR    SIZEQ             COMPARE PREC(ARG2) WITH PREC(RESULT)
  628.   IFCC    EQ             IF PREC(ARG2) = PREC(RESULT) THEN
  629. *   A CONTAINS INDEX (0-4)
  630.     LDX  XREG-CCREG,S         RESTORE PTR TO RESULT
  631.     LDY  YREG-CCREG,S         RESTORE PTR TO SOURCE
  632.     IF A,GE,#2             IF EXTENDED THEN
  633.       LDB  8,Y
  634.       STB  8,X
  635.       LDB  9,Y
  636.       STB  9,X
  637.     ENDIF
  638.     IF A,GE,#1             IF DOUBLE OR EXTENDED
  639.       MOVD  (6,Y),(6,X)
  640.       MOVD  (4,Y),(4,X)
  641.     ENDIF
  642.     MOVD  (2,Y),(2,X)
  643.     MOVD  (,Y),(,X)
  644.     PULS  #ALLPC         EXIT
  645.   ELSE                 {PREC(ARG2) NE PREC(RESULT)}
  646.     LDA  #FCMOV          SET FUNCTION CODE
  647.     LDX  UREG-CCREG,S         X = PARAMETER WORD
  648.     LBSR IREG             GO INIT STACK FRAME
  649.     CLRB             SET TO GET SOURCE (ARG2)
  650.     LBSR GET2M             GET SOURCE
  651.     LBRA IMOV             GO JOIN MUTUAL PROC.
  652.   ENDIF
  653.   PAGE
  654. *
  655. *
  656. ****** CONVERT DECIMAL BCD STRING TO FLOATING ***********
  657. *
  658. * RFPDB
  659. *
  660. * REGISTER CALL
  661. *
  662. * ON ENTRY:
  663. *   X = ^RESULT
  664. *   D = ^FPCB
  665. *   U = PTR TO INPUT BCD STRING
  666. *
  667. RFPDB  EQU  *
  668.   LBSR IREG            GO INIT STACK FRAME
  669.   LDX UREG,U              GET PTR TO INPUT STRING
  670.   LDB POFF,X              GET P FROM STRING
  671.   STB P,U              PUT IN TPARAM
  672.   MOVY (UREG,U),(FRACT2,U)   DECBIN ONLY GETS PTR TO STRING IN ARG2
  673.   LBRA    IFLOAT           GO DO IT
  674. *
  675. *
  676. ************* CONVERT FLOATING TO BCD STRING ***********************
  677. *
  678. *  RFPBD
  679. *
  680. *  REGISTER CALL
  681. *
  682. *  ON ENTRY:
  683. *     U = K
  684. *     X = ^ TO OUTPUT BCD STRING
  685. *     Y = ^ARG2 (FLOATING)
  686. *     D = ^FPCB
  687. *
  688. RFPBD  EQU  *
  689.   LBSR IREG            INIT STACK FRAME
  690.   MOVD    (UREG,U),(TPARAM,U)  STORE K IN STACK FRAME
  691.   MOVX    (XREG,U),(FRACTR,U)  STORE ^ARG2 IN RESULT FRACTION
  692.  LBSR    GET2             GET ARG2
  693.   BCC    RBDXIT             TRAPPING NAN
  694.   LBSR    DISPAT             GO TO BINDEC
  695.   LBSR    TRAP             CHECK FOR TRAPS (RESULT ALREADY RETURNED)
  696. RBDXIT    EQU  *
  697.   LBRA    RDYXIT             CLOSE STACK AND EXIT
  698. *ZZZZZZZZ
  699. *
  700.   PAGE
  701. *
  702. ********************************************************************
  703. **********************
  704. *
  705. *   STACK CALLS
  706. *
  707. *   FOR MOST STACK CALLS THE FOLLOWING ARGUMENTS ARE ON THE
  708. *   STACK BEFORE THE CALL. FOR MONADIC CALLS ARG1 IS OMMITED
  709. *
  710. *     HIGH MEMORY   ARG1
  711. *       |        ARG2           <-- PTOS,U
  712. *     LOW MEMORY    POINTER TO FPCB
  713. *
  714. *   FOR COMPARES OR MOVES THE STACK ALSO CONTAINS THE PARAMETER WORD
  715. *
  716. *     HIGH MEMORY   ARG1
  717. *       |        ARG2
  718. *       |        TPARAM           <-- PTOS,U
  719. *     LOW MEMORY    POINTER TO FPCB
  720. *
  721. *   ON RETURN FROM ALL STACK CALLS, ALL OF THE ABOVE
  722. *   ARGUMENTS ARE REMOVED FROM THE STACK AND ONLY THE
  723. *   RESULT IS ON THE STACK
  724. *
  725. *
  726. *   FOR ALL STACK CALLS THE POINTER TO THE TOS (PTOS,U)
  727. *   POINTS TO THE ADDRESS JUST ABOVE THE POINTER TO THE
  728. *   FPCB DURING THE OPERATIONS. PTOS,U IS INITIALIZED BY ISTACK.
  729. *
  730. *
  731. *  ON ENTRY TO THE FOLLOWING CODE Y POINTS TO THE LOCATION
  732. *  JUST ABOVE THE ^FPCB. THIS IS ^TOS (PTOS).
  733. *  U CONTAINS THE ADDRESS OF 'ISTACK'. THIS WAS DONE TO REDUCE
  734. *  THE SIZE OF THE NUMEROUS CALLS TO ISTACK.
  735. *
  736. *
  737. *
  738. ***********************
  739. ********************************************************************
  740. *
  741. *
  742. *
  743. ******************* DYADIC CALLS *********************************
  744. *
  745. *
  746. * COMMON ENTRY FOR STACK CALLS TO:
  747. *   ADD,SUB,MUL,DIV AND REM
  748. *
  749. ****
  750. SDYAD  EQU  *
  751.   LBSR ISTACK
  752. * Y STILL POINTS TO TOS
  753.   LEAX    ARG2,U             GETARG(^TOS,^ARG2)
  754.   LBSR    GETARG
  755.   BCC  SDYXIT             EXIT IF TRAPING NAN ABORT
  756.   BSR  RSIZE             TEMP:=^TOS+SIZE(ARG2)
  757.   PSHS    A             PUSH RESULT SIZE
  758.   LEAY    A,Y
  759.   LEAX    ARG1,U             GETARG(TEMP,^ARG1)
  760.   LBSR    GETARG
  761.   BCC  SDYXIT             EXIT IF TRAPPING NAN ABORT
  762.   PSHS    Y             SAVE TEMP (PTR TO RESULT)
  763.   LBSR    DISPAT             GO DO FUNCTION
  764.   LBSR    TRAP             TRAPS?
  765.   PULS    X             X:=TEMP
  766.   IFCC    CS             IF RESULT SHOULD BE RETURNED THEN
  767.     LBSR  MOVRSL           MOVERESULT(TEMP)
  768.   ENDIF
  769. SDYXIT    EQU  *
  770.   LDB  ,S            GET RESULT SIZE
  771.   ADDB #2
  772.   LBSR CLSTAK            CLOSE STACK
  773.   LBRA DO_UP            MOVE STACK UP RESULT SIZE + 2 AND EXIT
  774. *
  775. *
  776. ******************************************
  777. *
  778. * RSIZE
  779. *
  780. * LOCAL SUBROUTINE TO CALCULATE THE SIZE OF THE
  781. *  RESULT. ASSUMES RPREC IS ALREADY STORED ON
  782. *  THE STACK FRAME
  783. *  (CALCULATES SIZE OF ARG2 FOR COMPARES AND THE
  784. *   DESTINATION FOR MOVS.)
  785. *
  786. *  ON EXIT A CONTAINS THE SIZE OF RESULT
  787. *
  788. *****************************************
  789. *
  790. RSIZE  EQU  *
  791.        PSHS  Y
  792.        LDA  RPREC,U         GET PRECISION OF RESULT
  793.        LSRA             DIVIDE INDEX BY 2
  794.        LEAY SIZTAB,PCR         PTR TO CONVERSION TABLE
  795.        LDA  A,Y          GET SIZE
  796.        PULS Y,PC         RESTORE AND RETURN
  797.   PAGE
  798. *
  799. **************** MONADIC CALLS ***************************
  800. *
  801. *  STACK CALL
  802. *
  803. *  SQUARE ROOT , INTEGER PART, ABSOLUTE VALUE, NEGATE
  804. *
  805. *
  806. *  COMMON ENTRY FOR STACK CALLS TO MONADIC OPERATIONS:
  807. *     SQRT, INT
  808. *
  809. SMON  EQU  *
  810.   LBSR ISTACK
  811. * Y STILL CONTAINS ^TOS
  812.   LEAX    ARG2,U             GETARG(^TOS,^ARG2)
  813.   LBSR    GETARG
  814.   BCC  SMONX             EXIT IF TRAPPING NAN ABORT
  815.   LBSR    DISPAT             GO DO FUNCTION
  816.   LBSR TRAP             TRAPS?
  817.   IFCC    CS             IF WE SHOULD RETURN RESULT THEN
  818.     LDX  PTOS,U          MOVERESULT(^TOS)
  819.     LBSR  MOVRSL
  820.   ENDIF
  821. SMONX  EQU *
  822.   LBSR    CLSTAK             CLOSE STACK
  823.   UP 2                 MOVE REGS UP BY 2 AND EXIT
  824. *
  825.   PAGE
  826. *
  827. **************** STACK COMPARES *******************************
  828. *
  829. *  SFPCMP
  830. *
  831. *
  832. *  ON ENTRY:
  833. *     S POINTS TO PARAMETER WORD
  834. *   2,S POINTS TO POINTER TO FPCB
  835. *   4,S POINTS TO ARG2 ON USERS STACK
  836. *
  837. ******************
  838. *
  839. *  SOME LOCAL EQUATES FOR ALL COMPARES:
  840. *    SINCE STACK COMPARES BUILD SOME TEMPORARY AREA
  841. *    BETWEEN THE CALLER'S DATA ON THE STACK AND THE
  842. *    STACK FRAME, THERE ARE SOME ADDITIONAL OFFSETS
  843. *    FROM THE STACK FRAME POINTER
  844. CFLAG  EQU  CALLPC+2         1 = PREDICATE CALL
  845. CSP    EQU  CFLAG+1         STACK POINTER JUST BEFORE FINAL RTS
  846. CPARG1 EQU  CSP+2         POINTER TO ARG1 IN USER STACK
  847. CPARAM EQU  CPARG1+2         USER PARAMETER
  848. CFPCB  EQU  CPARAM+2         POINTER TO USER'S FPCB
  849. CARG2  EQU  CFPCB+2         OFFSET TO ARG2 IN USER STACK
  850. TSIZE  EQU  CPARG1-CALLPC    SIZE OF TEMPORARY AREA
  851. *
  852. *
  853. *   MUTUAL PROCESSING FOR ALL STACK COMPARES
  854. *
  855. *  AFTER THE PC IS MOVED DOWN (SEE CODE BELOW) THE
  856. *  STACK FRAME LOOKS LIKE:
  857. *
  858. *     ITEM       SIZE      OFFSET FROM U
  859. *     ARG1        ?
  860. *     ARG2        ?         CARG2
  861. *     TPARAM     2         CPARAM
  862. *     ^FPCB        2         CFPCB
  863. *     ^ARG1        2         CPARG1
  864. *     ^LAST SP   2         CSP
  865. *     PRED. FLAG 1         CFLAG
  866. *     CALLERS PC 2         CALLPC
  867. *     REGS        X
  868. *     STACK FRAME
  869. *             <------- U
  870. *
  871. SFPCMP EQU *
  872.   DOWN    TSIZE             MOVE REGS DOWN TSIZE BYTES
  873.   LDX    SIZREG,S         GET RETURN PC (PTS ONE PAST OPCODE)
  874.   LDA    -1,X             GET OPCODE
  875.   LDX  SIZREG+TSIZE+4,S      GET PARAMETER WORD
  876.   LBSR ISTACK              INIT STACK
  877.   CLR    CFLAG,U          0= NON PRED. CALL
  878.   IF    A,EQ,#FCPCMP         IF PREDICATE CALL THEN
  879.     INC  CFLAG,U           1 = PRED. CALL
  880.   ELSE
  881.     IF    A,EQ,#FCTPCM           IF PRED. CALL THEN
  882.       INC  CFLAG,U         1 = PRED. CALL
  883.     ENDIF
  884.   ENDIF
  885. * STACK NOW LOOKS LIKE ABOVE
  886.   BSR    RSIZE             TEMP := SIZE(ARG2)
  887.   ADDA #CARG2             CALCULATE POINTER TO ARG1 ON USER'S STACK
  888.   LEAX A,U
  889.   STX  CPARG1,U          SAVE IT
  890.   CLRB                 SIZE(ARG1)
  891.   LBSR SIZE
  892.   SUBB #3             CALCULATE POINTER TO LAST SP
  893.   LEAX B,X             NOTE THAT LAST SP+3 IS ADDRESS OF RESULT IF ANY
  894. *                 LAST SP+1 WILL HOLD FINAL CCREG
  895.   IFTST (CFLAG,U),NE,#0      NEED SPACE FOR RESULT?
  896.     LEAX -1,X             IF SO THEN MOVE LAST SP DOWN 1
  897.   ENDIF
  898.   STX CSP,U             SAVE LAST SP
  899. *
  900. * TEMPORARY AREA OF STACK IS NOW SETUP
  901. *
  902.   LEAY    CARG2,U          GETARG(ARG2,^ARG2)
  903.   LEAX    ARG2,U
  904.   LDB    #1
  905.   LBSR    GETARG
  906.   BCC    SCXIT             TRAPPING NAN ABORT
  907.   LDY    CPARG1,U         GETARG(PARG1,^ARG1)
  908.   LEAX    ARG1,U
  909.   CLRB
  910.   LBSR    GETARG
  911.   BCC    SCXIT             TRAPPING NAN ABORT
  912.   LBSR    DISPAT             GO DO COMPARE
  913.   LBSR    TRAP             TRAPS?
  914.   IFCC    CS             IF RESULT SHOULD BE RETURNED
  915.   LDX CSP,U             GET ADDRESS OF WHERE RESULT,ETC GO
  916. *
  917. * AT THIS POINT X POINTS TO:
  918. *   3,X  RESULT IF ANY
  919. *   1,X  PLACE FOR RETURN PC
  920. *   0,X  PLACE FOR RETURN CCREG
  921. *
  922.     IFTST  (CFLAG,U),NE,#0   IF THERE IS A RESULT (PREDICATE COMPARE)
  923.       MOVA (FRACTR,U),(3,X)  STORE PREDICATE RESULT
  924.     ENDIF
  925.   ENDIF
  926. *
  927. SCXIT EQU *
  928.   MOVA (CCREG,U),(,X)         MOVE RETURN CCREG
  929.   MOVD (CALLPC,U),(1,X)      MOVE PC UP STACK
  930.   LBSR CLSTAK             CLOSESTACK
  931.   PULS #ALL             RESTORE CALLER'S REGS
  932.   LDS  CSP-CALLPC,S         GET LAST SP
  933.   PULS CC,PC             LOAD CC'S AND RETURN
  934.   PAGE
  935. *
  936. *
  937. **************** FLOAT TO 16 BIT INTEGER *********************
  938. *
  939. * SFPFXS
  940. *
  941. * STACK CALL
  942. *
  943. SFPFXS    EQU  *
  944.   LBSR ISTACK              GO INIT STACK FRAME
  945.   BSR    SFIX             DO COMMON STACK 'FIX' CODE
  946.   IFCC    CS             IF RESULT SHOULD BE RETURNED THEN
  947.     MOVY  (FRACTR,U),(-2,X)
  948.   ENDIF
  949.   BRA  FIXMUT
  950. *
  951. *
  952. **************** FLOAT TO 32 BIT INTEGER *********************
  953. *
  954. * SFPFXD
  955. *
  956. * STACK CALL
  957. *
  958. SFPFXD    EQU  *
  959.   LBSR ISTACK              GO INIT STACK FRAME
  960.   BSR    SFIX             DO COMMON STACK 'FIX' CODE
  961.   IFCC    CS             IF RESULT SHOULD BE RETURNED THEN
  962.     MOVY  (FRACTR,U),(-4,X)
  963.     MOVY  (FRACTR+2,U),(-2,X)
  964.   ENDIF
  965.   SUBA    #2             SIZE - 2
  966. FIXMUT    EQU  *
  967.   TFR    A,B
  968.   LBSR    CLSTAK             CLOSESTACK
  969.   LBRA DO_UP
  970.   PAGE
  971. *
  972. ************
  973. *
  974. * SFIX
  975. *   LOCAL SUBROUTINE FOR STACK 'FIXES'
  976. *
  977. * ENTER:
  978. *  A = FUNCTION CODE
  979. *  U = POINTER TO STACK FRAME
  980. *  Y = ^TOS
  981. * EXIT:
  982. *  X = POINTER TO ADDRESS ABOVE CALLER'S ARGUMENT
  983. *  A = ARGUMENT SIZE
  984. *  C = 1 IFF RESULT SHOULD BE RETURNED
  985. *
  986. SFIX  EQU  *
  987.   LEAX    ARG2,U             GETARG(^TOS,^ARG2)
  988.   LBSR    GETARG
  989.   BCC    OUTFIX
  990.   LBSR    DISPAT             GO DO FIX
  991.   LBSR    RSIZE             GET SIZE OF FLOATING ARG
  992.   LDX    PTOS,U             X := ^TOS + SIZE(RESULT)
  993.   LEAX    A,X
  994.   LBSR    TRAP             GO DO TRAP IF ANY
  995. OUTFIX    EQU  *
  996.   RTS
  997.  PAGE
  998. *
  999. ********* 32 BIT INTEGER TO FLOAT **********************************
  1000. *
  1001. * SFPFLD
  1002. *
  1003. * STACK CALL
  1004. *
  1005. SFPFLD    EQU  *
  1006.   BSR EPREC            GET PRECISION OF RESULT
  1007.   IF  A,NE,#PRSIN         IF NOT SINGLE THEN
  1008.     IF A,EQ,#PRDBL         IF DOUBLE
  1009.       DOWN 2             MOVE REGS DOWN 2
  1010.     ELSE
  1011.       DOWN 4             EXTENDED, MOVE REGS DOWN 4
  1012.     ENDIF
  1013.   ENDIF
  1014.   LDA  #FCFLTD             SET FUNCTION CODE
  1015.   LBSR ISTACK              GO INIT STACK FRAME
  1016. * Y STILL POINTS TO TOS
  1017.   LDB  #4             SET 32 BIT FLAG
  1018.   MOVX (,Y),(FRACT2,U)         MOVE 32 BIT INTEGER TO ARG2
  1019.   MOVX (2,Y),(FRACT2+2,U)
  1020.   IFCC    EQ             IF LEAST SIGNIFICANT BYTES = ZERO THEN
  1021.     LDX  ,Y             SET CC BITS FROM MS BYTES
  1022.   ENDIF
  1023.   BRA  FLSMUT
  1024. *
  1025. **************
  1026. *
  1027. * EPREC - LOCAL SUBROUTINE TO DETERMINE THE PRECISION OF THE
  1028. *      RESULT BEFORE THE STACK FRAME IS BUILT.
  1029. *
  1030. * ON ENTRY THE PTR TO THE FPCB SHOULD BE ON THE STACK
  1031. * JUST ABOVE THE RETURN PC (THE ORIGINAL ONE; NOT THE PC
  1032. * GENERATED BY THIS CALL).
  1033. *
  1034. * ON EXIT A CONTAINS THE INDEX LEFT JUSTIFIED
  1035. *
  1036. *************
  1037. *
  1038. EPREC  EQU  *
  1039.   LDA [SIZREG+4,S]         GET FPCB CONTROL BYTE
  1040.   ANDA #$E0             MASK OFF INDEX
  1041.   RTS
  1042. *
  1043. *
  1044.   PAGE
  1045. ************ 16 BIT INTEGER TO FLOAT ************************
  1046. *
  1047. * SFPFLS
  1048. *
  1049. * STACK CALL
  1050. *
  1051. SFPFLS    EQU  *
  1052.   BSR  EPREC             GET EARLY PRECISION OF RESULT
  1053.   IF A,NE,#PRSIN         IF NOT SINGLE THEN
  1054.     IF A,EQ,#PRDBL         IF DOUBLE
  1055.       DOWN 4             MOVE REGS DOWN 4
  1056.     ELSE
  1057.       DOWN 6             EXTENDED, MOVE REGS DOWN 6
  1058.     ENDIF
  1059.   ENDIF
  1060.   LDA  #FCFLTS             SET FUNCTION CODE
  1061.   LBSR ISTACK              GO INIT STACK FRAME FOR STACK CALL
  1062. * Y STILL POINTS TO TOS
  1063.   LDB  #2             16 BIT INTEGER FLAG
  1064.   MOVX    (,Y),(FRACT2,U)      MOVE 16 BIT INTEGER TO ARG2
  1065. *
  1066. * MUTUAL PROCESSING FOR STACK 'FLOAT' ROUTINES
  1067. *   ON ENTRY:
  1068. *    Z = 1 IFF INTEGER EQUALS ZERO
  1069. *    B = 2 = 16 BIT INTEGER
  1070. *    B = 4 = 32 BIT INTEGER
  1071. *
  1072. FLSMUT    EQU  *
  1073.   PSHS    B             SAVE FLAGS
  1074.   IFCC    NE             IF NOT ZERO
  1075.     CLR TYPE2,U          TYPE := NORMALIZED
  1076.   ELSE
  1077.     MOVA #TYZERO,(TYPE2,U)   TYPE := ZERO
  1078.   ENDIF
  1079.   LBSR    DISPAT             GO DO FLOAT
  1080.   LBSR    TRAP             GO CHECK FOR TRAPS
  1081.   IFCC    CS             IF RESULT REQUESTED THEN
  1082.     LDX  PTOS,U          GET ^TOS
  1083.     LDB  ,S             GET FLAG (FLAG=NBR OF BYTES IN INTEGER)
  1084.     LEAX B,X             X := TOS + INTEGER SIZE - SIZE(RESULT)
  1085.     LBSR RSIZE
  1086.     NEGA
  1087.     LEAX A,X
  1088.     LBSR MOVRSL          MOVERESULT(X)
  1089.   ENDIF
  1090.   PULS    B             RESTORE FLAG
  1091.   LDA    RPREC,U          GET PRECISION
  1092.   LBSR    CLSTAK             CLOSESTACK
  1093.   IF D,EQ,#4             IF 32 BIT INTEGER AND SINGLE PRECISION RESULT THEN
  1094.     UP 2
  1095.   ENDIF
  1096.   PULS #ALLPC
  1097.   PAGE
  1098. *
  1099. *********** MOVE (CONVERT) TOP OF STACK ******************
  1100. *
  1101. * SFPMOV
  1102. *
  1103. * STACK CALL
  1104. *
  1105. * ON ENTRY STACK CONTAINS:
  1106. *      ARG2
  1107. *      PARAMETER WORD     <-- PTOS,U
  1108. *      POINTER TO FPCB
  1109. *
  1110. SFPMOV    EQU  *
  1111.   LDD    ,Y             GET SIZE PARAMETER
  1112.   BSR     SIZEQ              COMPARE PREC(ARG2) TO PREC(RESULT)
  1113.   IFCC    EQ             IF PREC(ARG2) = PREC(RESULT)
  1114. *   THIS IS BASICALLY A NOP
  1115.     UP 4             MOVE REGS UP BY 4 AND EXIT
  1116.   ENDIF              MOVE IS AN IMPLIED OPERATION (CONVERT)
  1117. *   Y STILL POINTS TO TOS
  1118.     LDD   ,Y             GET SIZE PARAMETER AGAIN
  1119.     LDA   #16             SHIFT LEFT 4 BITS
  1120.     MUL              A=PREC(ARG2); B=PREC(RESULT)*16
  1121.     IFTST  A,EQ,#0         IF ARG2 IS SINGLE THEN
  1122.       IF B,GE,#$20         IF SINGLE TO EXTENDED THEN
  1123.     DOWN 2
  1124.       ENDIF
  1125.     ENDIF
  1126.     LDA  #FCMOV          SET FUNCTION CODE
  1127.     LDX  ,Y             X = PARAMETER WORD
  1128.     LBSR ISTACK           ISTACK(^TOS,FCMOV)
  1129.     LEAY 2,Y             GETARG(^TOS+2,^ARG2)
  1130.     LEAX ARG2,U
  1131.     CLRB             FLAG TO INDICATE SOURCE ARG (ARG2)
  1132.     LBSR GETARG
  1133.     BCC  SMOVXT          EXIT IF TRAPPING NAN
  1134.     LBSR DISPAT          GO DO CONVERT
  1135. *    CALCULATE RESULT ADDR EVEN IF WE DON'T HAVE TO RETURN RESULT
  1136.       LDX  PTOS,U         X := ^TOS+2 + SIZE(ARG2) - SIZE(RESULT)
  1137.       LEAX 2,X
  1138.       CLRB             SIZE(ARG2)
  1139.       LBSR SIZE
  1140.       LEAX B,X
  1141.       LBSR RSIZE         SIZE(RESULT)
  1142.       NEGA             -SIZE(RESULT)
  1143.       LEAX A,X
  1144.       TFR X,D             PUT RESULT ADDRESS IN D TOO
  1145.     LBSR TRAP             CHECK FOR TRAPS
  1146.     IFCC CS             IF WE SHOULD RETURN A RESULT THEN
  1147.       LBSR MOVRSL         MOVERESULT(X)
  1148.     ENDIF
  1149. *
  1150. *  CALCULATE THE DISTANCE BETWEEN THE ADDRESS JUST ABOVE
  1151. *  THE RETURN PC AND THE BOTTOM OF THE ARGUMENT. THIS
  1152. *  IS THE DISTANCE THE STACK SHOULD BE MOVED UP.
  1153. *
  1154. *  (CALLPC + 2,U) IS THE ADDRESS JUST ABOVE THE PC
  1155. *  D CONTAINS THE ADDR OF THE RESULT
  1156. *
  1157. SMOVXT    EQU  *
  1158.   LBSR    CLSTAK             CLOSESTACK
  1159.   LEAY CALLPC+2,U           GET ADDR JUST ABOVE RETURN PC.
  1160.   PSHS Y
  1161.   SUBD ,S++             CALCULATE DISTANCE TO MOVE REGS UP
  1162.   LBNE DO_UP             IF NEEDED, GO MOVE UP AND EXIT
  1163.   PULS #ALLPC             NO MOVE UP NEEDED, EXIT
  1164. *
  1165. *
  1166. *************
  1167. *
  1168. * SIZEQ
  1169. *
  1170. * COMPARE PRECISIONS OF ARGUMENTS FOR MOV
  1171. * LOCAL SUBROUTINE FOR STACK AND REGISTER MOVES
  1172. *
  1173. * ON ENTRY: D CONTAINS THE PARAMETER WORD
  1174. * ON EXIT: Z = 1 IFF ARGUMENTS ARE SAME PRECISION
  1175. *       A CONTAINS PRECISION OF SOURCE (ARG2)
  1176. *       B IS DESTROYED
  1177. *
  1178. *************
  1179. *
  1180. SIZEQ  EQU *
  1181.   TFR  B,A             COPY PRECISION BYTE INTO A TOO
  1182.   ANDA #$F             GET PRECISION OF RESULT
  1183.   PSHS A             PUSH IT
  1184.   LDA  #16             MOVE PRECISION OF ARG2 TO A-REG
  1185.   MUL
  1186.   CMPA    ,S+             COMPARE PREC(ARG2) TO PREC(RESULT)
  1187.   RTS
  1188.   PAGE
  1189. *
  1190. *
  1191. ******** CONVERT DECIMAL BCD STRING TO FLOATING (INS)  **********
  1192. *
  1193. * SFPDB
  1194. *
  1195. * STACK CALL
  1196. *
  1197. * ON ENTRY STACK LOOKS LIKE
  1198. *    ENTRY            SIZE     POINTER
  1199. *    BCD STRING        26
  1200. *    ^FPCB             2
  1201. *
  1202. SFPDB  EQU  *
  1203.   LBSR ISTACK              INIT STACK FRAME
  1204.   MOVA    (POFF,Y),(P,U)         STORE P IN STACK FRAME
  1205.   STY    FRACT2,U         DECBIN ONLY GETS PTR TO BCD STRING
  1206.   LBSR    DISPAT             GO DO DECBIN
  1207.   LBSR    RSIZE             CALCULATE ADDR OF RESULT
  1208.   TFR  A,B
  1209.   NEGB                 TEMP := ^TOS +27 -SIZE(RESULT)
  1210.   SEX
  1211.   ADDD PTOS,U
  1212.   ADDD #26
  1213.   TFR  D,X             TEMP IS NOW IN X
  1214.   LBSR TRAP             GO CHECK TRAPS
  1215.   IFCC CS             IF RESULT SHOULD BE RETURNED THEN
  1216.     LBSR  MOVRSL         MOVERESULT(TEMP)
  1217.   ENDIF
  1218. * D CONTAINS PTR TO RESULT
  1219.   BRA  SMOVXT            GO MOVE REGS UP, ETC. AND EXIT
  1220. *
  1221. ************** FLOATING TO BCD STRING (OUTS) *******************
  1222. *
  1223. * SFPBD
  1224. *
  1225. * STACK CALL
  1226. *
  1227. * STACK BEFORE CALL
  1228. *      ARG2    (4,8 OR 10 BYTES)
  1229. *      K       1 BYTE
  1230. *      ^FPCB   2 BYTES
  1231. *
  1232. SFPBD  EQU  *
  1233.   LBSR    EPREC             GET PRECISION OF ARG2
  1234. * MAKE ROOM FOR RESULT
  1235.   IF A,EQ,#PRSIN         IF SINGLE THEN
  1236.     DOWN 19             {26-7}
  1237.   ELSE
  1238.     IF A,EQ,#PRDBL         IF DOUBLE THEN
  1239.       DOWN 15             {26-11}
  1240.     ELSE             {EXTENDED}
  1241.       DOWN 13             {26-13}
  1242.     ENDIF
  1243.   ENDIF
  1244.   LDA  #FCBNDC             SET FUNCTION OPCODE
  1245.   LBSR ISTACK              INIT STACK FRAME
  1246.   MOVA (,Y+),(K,U)         MOVE K ONTO THE STACK FRAME.AND BUMP Y
  1247.   LEAX CALLPC+2,U         GET ADDR OF RESULT
  1248.   STX  FRACTR,U          STORE ^ TO RESULT IN RESULT FRACTION
  1249. * Y PTS TO ARG2
  1250.   LEAX ARG2,U             GETARG(^TOS+1,^ARG2)
  1251.   LBSR GETARG
  1252.   BCC  SBDXIT             TRAPPING NAN ABORT
  1253.   LBSR DISPAT             GO TO BINDEC
  1254.   LBSR TRAP             PROCESS TRAPS (RESULT ALREADY RETURNED)
  1255. SBDXIT    EQU   *
  1256.   LBSR CLSTAK             CLOSESTACK
  1257.   PULS #ALLPC             ADIOS
  1258. *
  1259. *QQQQQQQ
  1260. *
  1261.   END
  1262.